package com.ruoyi.lvlian.util;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.ruoyi.common.core.utils.StringUtils;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.math.BigDecimal;
import java.math.RoundingMode;

public class FormulaToDoubleConverter implements Converter<Double> {

    @Override
    public Class<Double> supportJavaTypeKey() {
        return Double.class;
    }

    @Override
    public Double convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
                                    GlobalConfiguration globalConfiguration) throws Exception {
        try {
            if (CellDataTypeEnum.NUMBER.equals(cellData.getType())) {
                // 如果是数字类型，保留两位小数
                BigDecimal value = cellData.getNumberValue().setScale(2, RoundingMode.HALF_UP);
                return value.doubleValue();
            } else if (CellDataTypeEnum.STRING.equals(cellData.getType())) {
                String value = cellData.getStringValue();
                try {
                    BigDecimal numericValue = new BigDecimal(value);
                    return numericValue.setScale(2, RoundingMode.HALF_UP).doubleValue();
                } catch (NumberFormatException e) {
                    System.err.println("Invalid number format in column: " + contentProperty.getField().getName()
                            + ", with value: " + value);
                    return 0.0; // 默认值，或者根据业务需求处理
                }
            }

            String formula = cellData.getStringValue();

            // 如果公式不为空
            if (StringUtils.isNotBlank(formula)) {
                try {
                    // 解析并计算公式
                    return evaluateFormula(formula);
                } catch (Exception e) {
                    // 捕获异常并处理
                    System.err.println("Failed to evaluate formula: " + formula + " in column: "   + contentProperty.getField().getName()  );
                    e.printStackTrace();
                    return 0.0; // 返回默认值，或者根据业务需求返回其他值
                }
            }
            return 0.0;
        } catch (Exception e) {
            // 打印更详细的错误信息，包括列名和数据内容
            System.err.println("Error converting cell data in column: " + contentProperty.getField().getName()
                    + ", with value: " + cellData.toString());
            throw e; // 继续抛出异常以便捕获处理
        }
    }


    /**
     * 解析并计算公式，支持基本的加减乘除操作。
     *
     * @param formula Excel单元格中的公式字符串
     * @return 计算后的结果，保留两位小数
     */
    private Double evaluateFormula(String formula) throws ScriptException {
        // 去除公式前的 "=" 符号
        if (formula.startsWith("=")) {
            formula = formula.substring(1);
        }

        // 使用 JavaScript 引擎来计算公式
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("JavaScript");

        Object result = engine.eval(formula);

        if (result instanceof Number) {
            BigDecimal value = BigDecimal.valueOf(((Number) result).doubleValue());
            // 保留两位小数，四舍五入
            return value.setScale(2, RoundingMode.HALF_UP).doubleValue();
        }

        throw new ScriptException("该列值存在问题，导入失败: " + formula);
    }
}
